//北京中医药大学一键评教插件
//power by W66666 SCU
//Contact me: wangcheng.rui@163.com

/*
描述：
差错控制，防止在其他页面中启动该脚本
在其他页面启动，将弹出对话框，再抛出SyntaxError结束脚本
*/
if(window.location.href.indexOf("jw.bucm.edu.cn/framework/main.jsp")==-1){
    alert("请在BUCM教务处中操作");
    throw SyntaxError();
}


/*
描述：
初始化一键评教按钮与显示通知P
*/
function init(){
    if(document.getElementsByTagName("iframe")[0].contentDocument.getElementsByName("mainFrame")[0].contentDocument.getElementById("mxhDiv")==null){
        alert("未发现教学评价窗口");
        throw SyntaxError();
    }
    if(Frame.getElementById("PingjiaoButton")==null){
        var Button = document.createElement("button");
        Button.id="PingjiaoButton"
        Button.onclick=function(){Pingjiao();}
        Button.innerText="一键评教"
        Button.style.display="block"
        Frame.getElementById("toolbar").appendChild(Button); 
    }
}


/*
描述：
向用户显示通知

参数:
str:要显示的提醒
*/
function showAttention(str){
    // console.log(str)
}


/*
描述：
通过正则表达式获取每位教师的评价链接

参数:
str:需要解析的连接(为按钮onclick中的内容)

返回:教师的评价链接
*/
function getURL(str){
    var ans=str.match(/'.*'/g)
    if(ans.length!=1){
        throw "无法匹配连接"
    }
    return "http://jw.bucm.edu.cn"+ans[0].slice(1,-1);
}


/*
描述：
获取function执行中的错误
若发生错误，则alert错误自定义描述与错误，再抛出SyntaxError结束脚本

参数:
func:function
errMass:错误自定义描述
*/
function CatchErr(func,errMass){
    try{
        func();
    }catch (err){
        // console.log(err);
        alert(errMass+"\n"+err)
        showAttention("出现错误意外终止，请联系wangcheng.rui@163.com..")
        throw SyntaxError();
    }
}


/*
描述：
获取评教窗口Frame

*/
CatchErr(function(){
    showAttention("获取评价窗口..")
    Frame = document.getElementsByTagName("iframe")[0].contentDocument.getElementsByName("mainFrame")[0].contentDocument;
    showAttention("评价窗口获取成功！")
},"未发现教学评价窗口")


/*
描述：
进行评教具体操作
*/
function Pingjiao(){

    if(confirm("确定进行评教吗？")==false){
        throw SyntaxError();
    }

    if(confirm("确定直接评教吗？否则将先保存[建议首先点击取消进行保存查看效果，防止教务修改产生的问题]")==true){
        SAVE_SUBMIT="2"
    }
    else {
        SAVE_SUBMIT="1"
    }
    
    CatchErr(function(){
        showAttention("获取教师列表..")
        TeacherList=Frame.getElementById("mxhDiv").getElementsByTagName("tr");
    },"教师列表为空或未加载")

    CountSum=TeacherList.length
    CountSuccess=0
    CountFinish=0
    for(var ind = 0;ind < TeacherList.length ;++ind){
        showAttention("正在评教第"+(ind+1).toString()+"位教师:"+$.trim(TeacherList[ind].getElementsByTagName("td")[2].innerHTML)+"..")
        try{
            Url=TeacherList[ind].getElementsByTagName("td")[8].children[0].getAttribute("onclick")
            if(Url==null){
                Url=TeacherList[ind].getElementsByTagName("td")[9].children[0].getAttribute("onclick")
            }
            if(Url==null){
                CountFinish+=1;
                continue;
            }else{
                Url=getURL(Url);
            }
        }catch (err){
            // console.log(err);
            alert("无法获取教师评价连接")
            throw SyntaxError();
        }
        CatchErr(function(){
            Response=$.ajax({url:Url,async:false});
            if(Response.status!=200){
                throw "Statue:"+ Response.status.toString();
            }
            ResponseHTML=Response.responseText;
            $Response=$($.parseHTML(ResponseHTML))
        },"获取教师评价信息失败")
        CatchErr(function(){
            $Form=$Response.siblings("form[name='Form1']")
            ChoiceListA=new Array();
            $Response.find(":input[type='radio'][radioxh='0']").each(function(){
                if($.trim($(this).parent("td").text())!="优"){throw "评分表产生更改";}
                ChoiceListA.push($(this))
                $(this).prop("checked", true);
            })
            ChoiceListB=new Array();
            $Response.find(":input[type='radio'][radioxh='1']").each(function(){
                if($.trim($(this).parent("td").text())!="良"){throw "评分表产生更改";}
                ChoiceListB.push($(this))})
            if(ChoiceListA.length!=ChoiceListB.length || ChoiceListA.length!=19){throw "评分表产生更改";}
        },"获取选项失败")
        CatchErr(function(){
            MinArray=new Array();
            for(var ind = 0; ind < ChoiceListA.length;++ind){
                Ascore=ChoiceListA[ind].attr("value").match(/[0-9.]*,/g)
                Bscore=ChoiceListB[ind].attr("value").match(/[0-9.]*,/g)
                if(Ascore.length!=1 || Bscore.length!=1){throw "分数获取失败"+Ascore.length.toString()+" "+Bscore.length.toString();}
                Ascore=parseFloat(Ascore[0].slice(0,-1));
                Bscore=parseFloat(Bscore[0].slice(0,-1));
                if(Ascore-Bscore==1){
                    MinArray.push(ind);
                }
            }
            MinInd=Math.round(Math.random()*(MinArray.length-1))
            ChoiceListB[MinInd].prop("checked", true);
        },"分数获取失败")
        CatchErr(function(){
            PostUrl="/jxpjgl.do?method=savePj&tjfs="+SAVE_SUBMIT+"&val=";
            val=''
            $Response.find(":input[type='radio']").each(function(){
                if($(this).context.checked==true){
                    val+=$(this).attr("value")+"*";
                }
            })
            PostUrl += val.substring(0,val.length-1);
            
            // console.log(PostUrl)
            $Form.find("[name='type']")[0].value=SAVE_SUBMIT
            $.ajax({
                url:PostUrl,
                type:'POST',//GET
                async:false,//或false,是否异步
                data:$Form.serialize(),
                timeout:5000,    //超时时间
                success:function(data,textStatus,jqXHR){
                    CountSuccess+=1
                    showAttention(CountSuccess.toString()+"/"+(CountSum-CountFinish).toString())
                    // console.log(data)
                    // console.log(textStatus)
                    // console.log(jqXHR)
                },
                error:function(xhr,textStatus){
                    // console.log(xhr)
                    // console.log(textStatus)
                }
            })
            
        },"提交失败")
        
    }
    alert("共"+CountSum.toString()+"位老师，成功评教"+CountSuccess.toString()+"位，未进行评教"+CountFinish.toString()+"位，请再次点击教学评价确认结果")
}


if(typeof jQuery != 'undefined') {
    init()
}
else {
    var script = document.createElement("script");
    script.src="https://code.jquery.com/jquery-1.12.4.js";
    document.getElementsByTagName('head')[0].appendChild(script); 
    script.onreadystatechange=init()
}

